perm filename ARM.LOU[UP,DOC] blob sn#122296 filedate 1974-10-03 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00015 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	GENERAL
C00006 00003	DO <function> |  DO <program> |  DO If DO  is followed by  a function
C00013 00004	PARK
C00017 00005	OPEN <dist>
C00019 00006	FREE <n> <f1> ... <fn>
C00022 00007	CONO <arrive> <weight> <k> <ts> <tm>
C00025 00008	SAVE <id>
C00027 00009	 JUMP <label>
C00029 00010	ASSIGN <id> <integer>
C00032 00011	DEFINE <macro name> <par>
C00036 00012	This  is  a  programming  example.  We have the situation of the hand
C00040 00013		DEFINE	FIND	T D F		This macro is used to search
C00042 00014	ERRORS
C00044 00015	RUNNING THE ARM
C00048 ENDMK
C⊗;
GENERAL
The arm has  six degrees of freedom  corresponding to 6 joints.   The
joints are  numbered from 1 to 6 starting  at the shoulder and moving
out to the  hand. All rotary  joint angles  are measured in  degrees.
Joint 3 which is linear and is measured in inches.

The coordinate system is  referenced to the table top  with the table
lying in the x y plane at z=0 with the z axis pointing vertically up.
The origin is at the far corner of the table. The base of the  arm is
at 20,10 approximately.

The Arm is normally controlled by  specifying  what  happens  to  the
hand. The program checks that the hand will not intersect the table.

On  the  finger  tips  are  two touch sensors which can interrupt arm
operation.

The  program  which runs the arm is in the form of an interpreter and
works in two basic modes: Planning and  Execution.  In  the  planning
mode  arm  functions are assembled into a data file which may then be
executed by a "DO" command. Functions may be immediately executed  by
prefixing the function call by "DO". For example.

	OPEN 3
	PARK
	DO

will cause a  data file to  be constructed, either  on the 3330  as a
file YELLOW.TRJ or on the Swapping disk, containing the two functions
open the hand to 3 inches  and then move to the park position.  These
two commands are then executed by the DO.

	DO OPEN 3
	DO PARK

This will have the same effect except  that the planning program will
be activated between each function call,  which is time consumming.

It is possible to write symbolic  programs  either  in  the  form  of
macros  using  the "DEFINE" pseudo op, or by creating a text file and
reading it in by a "REQUIRE" pseudo op.

What follows is a list of the Functions, Errors and how  to  run  the
arm. Note tha arm program does not respond to lower case characters.
DO <function> |  DO <program> |  DO If DO  is followed by  a function
then that  function will be executed. This  does not change the state
of any program being compiled. Otherwise the <id> following the DO is
taken as  the program name.   If DO is  terminated by a C/R  then the
default  program is executed. If  this does not  exist the servo will
return an error status 3.  The default program name  is YELLOW and is
changed  by DOing  another program,  in which  case its  program name
becomes the default, or by a BEGIN pseudo op.

REQUIRE <file spec>
This causes the input scanner to read from the designated file.  When
an  EOF  is encountered scan returns to the TTY. <file spec>::= <file
name>.<ext>[pppn] where if <ext> is null then  YEL  is  used  and  if
[pppn] is missing the running pppn is assumed.

DUMP <file spec>
This causes a file to be  opened  and  all  transforms,  vectors  and
macros  are  written  out  in  symbolic  form.  It is the opposite to
REQUIRE.  If  a  file  already  exists,  of  the  same  name,  it  is
over-written!!!

TRANS <id>
<X> <Y> <Z> <O> <A> <T>
This pseudo op is  on  two  lines  and  is  used  to  set  up  a  4x4
transformation  and  to identify it with an <id>. The <X> <Y> and <Z>
specify the position of a point centrally located between the  finger
tips in table coordinates. <O> <A> and <T> specify the orientation of
the hand. with all three angles (in degrees) zero the hand points  in
the  negative  "y"  direction with the fingers in a horizontal plane.
the orientation vector which points from one finger tip to the  other
is  aligned  along  the  "x"  axis.  <O>  specifies a rotation of the
orientation vector about a vertical direction; thus at <O>=90 degrees
the  hand  still  horizontal  would  point  along  the  positive  "x"
direction. <A> is a  rotation  about  the  orientation  vector.  With
<A>=90  degrees  the hand always points straight down. <T> is a final
rotation about the axis of the wrist and corresponds to a rotation of
the  final  joint.  When talking to the interpreter directly from the
TTY only as many parameters that have changed  need  to  be  retyped.
Further  a  delimiter  (which  includes  a  space) indicates that the
parameter is to remain unchanged.  For  example  to  change  the  <Z>
parameter only one types
TRANS <id>
<space><space><Z>C/R.

VECT <id>
<X> <Y> <Z>
This is similar to TRANS except that it sets up  vectors.  There  are
four predeclared vectors X,Y,Z,and NIL the null vector.

BEGIN <id>
This pseudo op starts a program of name <id>. If this  pseudo  op  is
not  given before any instruction then a default BEGIN <default name>
is automatically generated.

END
This closes the trajectory file. If a  program  has  not  been  ENDed
before a DO <program> is executed an automatic END is performed.

WAIT <message>
Causes the arm to  stop at the corresponding point  during execution.
Any  message string, limited  to about  60 characters, is  typed out.
Execution may be resumed (after executing any number of functions) by
a proceed command.

P <integer>
this causes the arm to proceed from a wait or an error state, if  the
argument  is  non  zero  execution  proceeds with the last or current
instruction, otherwise from the next instruction.

WHERE <id>
If <id> is  null then this causes the  arm's position to be  read and
the position, joint  angles and hand opening to be typed out. If <id>
is not null then it is assumed to be the name of a save  cell and its
value is typed  out instead. This function  is automatically executed
when  the program is started.  It should only be  executed if the arm
has been moved manually.

HERE <trans> | HERE <trans> <dx> <fac> <axis> <deg>
This is like TRANS except that the hands position is read as in WHERE
to  give the initial position for the transform <id>. Its main use is
in defining  positions  by  moving  the  hand  and  then  creating  a
transform  to  represent the present position. In the second form the
the value of the transform is such that when the vector  <dx>  scaled
by  <fac>  is  added  to it and the transform is rotated about <axis>
<deg> degrees the current hand position is obtained.

PARK
Generates  a  trajectory to the PARK position, which has joint angles
-180, -90, 14, -90, 90, 0

GOTO <trans> | GOTO <trans> <dx> <fac> <axis> <deg>
Generates  a three part trajectory to either <trans> or in the second
case to <trans> rotated about a  vector  <axis>,  <deg>  degrees  and
translated an additional vector <dx> scaled by <fac>.

GO <trans> | GO <trans> <dx> <fac> <axis> <deg>
This is the  same as GOTO  except that it is  a one part  direct move
with no lift off or set down.

MOVE <trans> | MOVE <trans> <dx> <fac> <axis> <deg>
This is the  same as GOTO except  that a smooth trajectory  is fitted
through the three positions.

DRAW <pos> <rot> <angle> <crank> <axis> <deg> <time> <loop>
This  is  a  controlled  motion of the hand. The hand is moved to its
present position plus the vector <pos>.  As  it  moves  the  hand  is
rotated about a vector <rot>, <angle> degrees. If <crank> is not null
then the hand is assumed to be attached  to  a  crank  which  is  the
initial  position  +  <crank> and as the first motion is executed the
hand attached to the end of the crank is rotated about an axis <axis>
<deg>  degrees.  If  loop  is  non  zero  and  the  initial and final
positions are the same the loop motion may be  repeated  continuously
<loop> times. The entire motion takes <time> jiffies. A jiffy is 1/60
th. second.

CHANGE <dx> <fac> <rot> <deg> <time>
This  causes a differential motion of vector <dx> scaled by <fac> and
simultaneously the hand rotated about a vector <rot>, <deg>  degrees.
If <time> > 0 then the motion shall take <time> jiffies.

DRIVE <joint> <dist> <time>
This causes joint <joint>(1 is the root joint -- 6 is the hand) to be
driven  <dist> degrees,   or  in the  case of  joint 3  ---inches. If
<time> >  0 then  the motion  shall take  <time>  jiffies. All  other
joints brakes remain on unless free joints are also specified.

PLACE
This causes the hand to move down until it meets some resistance.
OPEN <dist>
This causes the hand to be opened or closed until the opening between
the  fingers is <dist>, it gives up after about 4 seconds and returns
error 22 if it is unable to comply.

CLOSE <dist>
This  always  closes the hand until it meets some resistance. It then
checks that the opening of the hand is greater than <dist>. If it  is
less  it returns error 2. This is useful in checking that the hand is
holding something.

CENTER <dist>
This  is  the  same  as CLOSE except that the hand is driven to close
centrally over the object using touch.

SCREW <vel>
This instruction will drive the tool at velocity <vel> (maximum =63).
It must be MERGEd with some arm motion.
i.e.
	SCREW 27
	MERGE
	CHANGE REACH 1 NIL 0 100
While  the  hand reaches one inch the tool will drive at velocity 27.
Normally FREE joints would  also  be  specified  together  with  some
STOPping  constraint.

FREE <n> <f1> ... <fn>
For  each  of  the  <n>  direction vectors <fn> joints of the arm are
freed  during  the  next  arm  motion.  These  joints  have   gravity
compensation,  additional forces and acceleration compensation but no
position sensitive feedback. The vectors <fn> specify  directions  in
table coordinates.

For example.

	FREE 2 X Y
	CHANGE Z -1 NIL 0 100

Would provide for free motion in the x and y direction while the hand
moves down 1 inch for the next 100 jiffies.

SPIN <n> <f1> ... <fn>
For each of the <n> axis vectors <fn> joints of the arm are freed  as
in FREE.

FORCE <fv> <mv>
During the next arm motion additional predicted joint torques will be
applied such as to exert a force <fv> and moment <mv> at the hand.

For example.

	FREE 1 Z
	VECT F
	0 0 -50
	FORCE F NIL
	CHANGE NIL 0 NIL 0 100

This would provide for a direction of free motion in the z  direction
while  exerting  a  force of 50 oz. straight down. i.e. the hand will
push down at 50 oz for the next 100 jiffies.

STOP <fv> <mv>
If during the next arm motion the force and moment at the hand exceed
<fv>  and  <mv>  the  arm  will stop. If such a condition is not meet
during the motion an error 23 will be returned.

WOBBLE <deg>
This  causes  the outer three joints to be perturbed with a sine wave
of amplitude <deg> degrees.

NNUL
At  the  end  of the next motion do not wait to null out joint errors
but stop the arm immediately.




CONO <arrive> <weight> <k> <ts> <tm>
This function executed  immediately before any motion  instruction is
used to  modify the performance of that  motion. All motions start at
an initial position move  to a position  given by initial +  <depart>
where <depart>  is a vector which  is set to the  last <arrive> after
each  motion instruction.  The arm then  moves to a position given by
final + <arrive>,  and then to  the final position.   In the case  of
PARK <arrive>  is set to null.   A vector <k> is used  to specify the
radii of gyration  of the object  held in the  hand.  the  x axis  is
along  the direction  normal  to  the plane  of  the fingers.  the  y
direction is  along the direction of  the orientation vector (between
the finger  tips). and  the z  direction is  along  the fingers.  The
weight  of the  object is  given  in <weight>  in ounces.   <ts>,  if
positive,   is  the  minimum time  in jiffies  (1/60 second)  for the
initial and final parts of the trajectory, and <tm>, if positive,  is
the minimum time  for the mid part.  non zero  times are used to slow
down arm motions.

MERGE
This  function  if  executed  before  a motion instruction causes the
instruction before the motion instruction to  be  executed  with  the
motion.  This  is  only useful with OPEN if it is desired to open the
hand as it moves off.
i.e
	OPEN 3
	MERGE
	MOVE T
will cause the hand to start opening as the arm starts to move.

TOUCH <mask>
This causes the arm to stop during the next instruction if any of the
masked touch sensors in <mask> are activated.
i.e.
	TOUCH 3
	OPEN 0
will  cause  the  hand  to  close  until  it touches something. If it
touches anything an error <mask>&6 is returned where <mask> are those
sensors which have been activated.
SAVE <id>
The current deviation in position and orientation  from the set point
is  saved in  cell  <id>. for  example  if the  hand were  move  to a
position T and then  CENTERed the deviation  of position of the  hand
from T,  after the centering operation can be saved in <id>
i.e.
	MOVE T
	CENTER 1
	SAVE C1

SET <id> <t1> <t2>
This will preload  cell <id> with  the deviation to  produce position
and  orientation <t1>  when told  to move  to <t2>,  if this  cell is
RESTOREd with the move.

RESTORE <id> <int>
This instruction must be executed immediately  after  a  MOVE  or  GO
instruction and will cause the hand to move to the position specified
plus the deviation. SAVEd in cell <id>. If <int> is non zero the cell
will be freed for further use.
i.e.
	MOVE T
	RESTORE C1 1
will cause the  hand to move to T  plus the position SAVEd in  C1. It
will also free up C1 for further use.
 JUMP <label>
All instructions may be labelled by a label followed by a colon,  and
the JUMP instruction will cause control to jump to that instruction.
i.e.
L1:	MOVE T
	PARK
	JUMP L1
will cause an infinite loop.

SKIPE <error>
If error <error> occurs during execution on the previous  instruction
then the following instruction is skipped.
i.e.
L1:	OPEN 3
	CHANGE REACH 1 NIL 0 0
	CLOSE 1
	SKIPE 2
	JUMP L2
	JUMP L1
L2:
will  cause  the hand to advance by inches snapping its jaws until it
finds something wider than 1 inch.

SKIPN <error>
The same as SKIPE except that it skips only  if  the  error  did  not
occur. Which makes the last example cleaner.
L1:	OPEN 3
	CHANGE REACH 1 NIL 0 0
	CLOSE 1
	SKIPN 2
	JUMP L1

SKIPS <error>
This is like SKIPE in that the right octal digit of  the  error  must
match  exactly  but it also requires that the logical AND of the high
order digits with <error> is true. This is mostly used in touch work.
For  example if either error 46 or error 16 would indicate some state
then a SKIPS 56 would detect it.

ASSIGN <id> <integer>
This is  an  assignment statement  which can  be used  at runtime  in
conjunction with the SOJG instrution.

SOJG <id> <label>
This  instruction  Subtract  and  Jump  if  Greater  than  zero  will
decrement  an  assign cell  an  jump to  the  label if  the  count is
positive.

AOJ <label>
This  is  the  same  as JUMP except that it will perform a spiral box
search as follows. A SEARCH command must have first been executed  to
calculate the differential joint angle changes to make an x deviation
and a y deviation at the place that the search must be executed. Then
every  time  the  AOJ  instruction  is  executed  it first performs a
RESTORE of appropriate magnitude to  generate  the  spiral  and  then
performs the JUMP.
i.e.
	MOVE T
	SEARCH 1 Z X
L1:	MOVE T
	AOJ L1
Will cause a spiral search in one inch steps. The first move to T  is
important as the context for the SEARCH must be established.

SEARCH <step> <normal> <first_step>
Computes the change in  joint angles to conduct a search,  in a plane
normal to  <normal> starting in the direction <first_step>,from where
the arm is currently planned to be and zeros the AOJ counters.

FLUSH
Due  to  the  partial paging scheme used by the arm, Jumps must occur
within pages This instruction will cause a new page  to  be  started.
This will soon go away.

DEFINE <macro name> <par>
<body>
This defines a macro of name <macro name> and formal parameters given
by  <par>  a list of identifiers. The body then follows,line by line.
The macro is terminated by a blank line. macros  may  be  nested.  An
example
DEFINE GRAB MIN
MOVE T
CLOSE MIN

If the macro call appears then the expanded code will be assembled.
	GRAB 2
will assemble as
	MOVE T
	CLOSE 2
These macros are written out by the DUMP command and are read  in  by
the REQUIRE command.

ED <macro name>
This is a rudementary editor. The <macro  name>  must  be  given  the
first  time  but  need  not be gived again if the same macro is to be
re-edited. The macro definition is then presented line by line  every
time a C/R is typed. Previous lines may be retrieved by typing ALT.
	A "D" will delete the current line
	An "I" will insert a line after the present line, to be typed
	in.
	A "Z" will give the current line to the line editor.
	A "T" will cause the next line to be typed.
All these commands may be preceded by an unsigned integer which  will
do  n  of  them.  For  example  5D will delete the current and next 4
lines. When you have finished editing the macro  type  "E"  then  the
macro  will  be read in again and redefined. (assuming that the first
line which has the DEFINE is not deleted. This by the way is  a  good
way  to  modify  existing  macros  if the macro name is changed a new
macro will be defined. One additional feature  is  "F"  followed  SOS
manner  by  a  string.  It will then do a series of C/Rs until a line
with a matching string is found.
This  is  a  programming  example.  We have the situation of the hand
holding the screw driver which has a screw on its  end.  We  want  to
insert the screw into a hole and to screw it all the way in.
	DEFINE	SCRW	H A		;The macro to screw the screw
					;into hole H using approach A
	VECT SA				;The  departure  vector  from
					;the screw dispenser
	0 -1 2
	VECT SCK			;The radii of gyration of the
					;screw driver
	.5 1.0 1.0
	CONO A SCK 50 10 40		;Set  up  the  conditions for
					;the move
	FIND H H 1			;A   nested   macro  call  to
					;perform the search
	VECT FV				;The  force to verify that it
					;is in the hole
	0 0 -60
	STOP FV NIL			;Stop during the next motion
	CHANGE Z -.7 NIL 0 0		;If the arm goes .7 inch then
					;we are not
					;in the hole and the arm will
					;stop with error 23
	FREE 3 X Y Z			;X, Y and Z  are  vectors  in
					;the x, y and  z  directions.
					;This   will    specify    of
					;freedom.
	VECT FV				;We will wnat  to  push  down
					;with this force
	0 0 -60
	FORCE FV NIL			;Push with force FV
	VECT MV				;This is the stopping moment
	0 0 -100
	STOP NIL MV			;Stop when we meet it.
	SCREW 60			;Drive  the  screw  driver at
					;this velocity
	MERGE				;while
	CHANGE NIL 0 NIL 0 100		;we  go nowhere while pushing
					;down,    with   three   free
					;joints,    monitoring    the
					;torque.
L1:	FREE 2 X Y			;The  screw  is now in and we
					;must  pull  the screw driver
					;out. We want two
	WOBBLE .2			;Shake things around a bit
	CHANGE Z .2 NIL 0 0		;while we go up 0.2 inches
	VECT FV				;Set up a force
	0 0 100
	STOP FV NIL			;and  stop  if it is exceeded
					;during   the   next  motion,
					;indicating that  the  driver
					;is jammed in the screw.
	NNUL				;dont null errors
	CHANGE Z 1 NIL 0 50		;and try to go up an inch.
	SKIPE 23			;this means that the stopping
					;force of 100 oz was not meet
					;and all is O.K.
	JUMP L1				;if not try again
	GO SC				;and go back to the dispenser
	DEFINE	FIND	T D F		;This macro is used to search
					;for  the hole The hole is at
					;Trans T offset by a vector D
					;scaled by F
	NNUL				;dont null the first time
	GO T D F NIL 0			;Go to the hole position
	VECT FV				;Maximum  resistance that the
					;screw will meet
	0 0 -50
	SEARCH .07 Z X			;Set  up  for a search of 0.7
					;in   steps.  Note  that  the
					;context  for  the search has
					;been   established   by  the
					;previous GO.
	CONO NIL SCK 10 0 0		;No  arrive  or  depart, move
					;directly
L1:	GO T D F NIL 0			;The search move
	STOP FV NIL			;Try to go down
	NNUL				;without nulling
	CHANGE Z -.6 NIL 0 60		;by 0.6 inches
	SKIPE 23			;if  we  meet resistance then
					;not in hole
	AOJ L1				;spiral and try again

ERRORS
This is a list of the error messages you might get when running the arm.
When running wave the error message corresponding to the error is typed.

	1	Arithmetic Overflow occured. Something bad has happened.
	<n>1	Excessive force occured at joint <n>
	2 	Hand closed more than minimum specified in CLOSE function
	3	File not found
	4	Someone has pawned the DSK
	5	Someone has sold the DSK
	<mask>6	Touch sensors <mask> have touched something
	7	Cannot read the joint positions, usually hardware trouble.
	20	Function took too long to execute
	22	Hand function took too long to execute.
	23	Arm failed to reach force limit set by STOP during motion.
	24	Arm in L1: JUMP L1 type loop.
	25	Save array number out of bound
	27	The function you have called is disconnected.
	30	The arm is down
	50	Librascope read error
	60	You have a very old program which does not match the
		current servo
	70	The reference supply used by the arm is off.
	100	The PDP6 is not running.
	200	The servo program has been interrupted.
	500	The arm solution does not exist
	600	No cell set up for SOJG


RUNNING THE ARM
Power  to the arm is controlled by a switch on a box with two lights.
The box is located on the rack under the table near the base  of  the
arm.  The  yellow light indicated that the power supply is on and the
red light indicated that the arm is also on.

There is also a grey box on the end of a cable with some switches and
a  →→→"RED  BUTTON"←←← on it. The buttons are brake releases. The one
furthest from the →→→"RED BUTTON"←←← is joint 1. There  is  no  brake
release  for  joint  6, sorry about that. The last switch is the hand
brake release. All brakes should be turned on when the arm  is  being
run.

Now  for  the →→→"RED BUTTON"←←←. If the →→→"RED BUTTON"←←← is pushed
while the arm is running the arm will stop and  all  brakes  will  be
applied.  You  should always be holding the box with your finger over
the →→→"RED BUTTON"←←← when running the arm. For  damaging  the  hand
...  -6  acamedic  credits.  For  damaging  the  arm ... -12 acamedic
credits.

There is also a bell that starts 1 second before the arm does in  the
case  of  a  DO  and starts with the arm in the case of a P. The bell
goes "ting, ting, ting," just like a truck  backing-up,  except  that
someone stole the bell, oh well!

RUNNING THE PROGRAM
The program is on 1,3 and is run by typing
R YELLOW
This program will in turn log in a servo program as a  PTY  job,  and
will  run  a  job  called ARM-Y. When this job is running you will be
asked if you want your files saved. If you respond  Y  then  the  arm
programs  will be written out on the 3330 with .TRJ extensions. These
files may be executed at a later time by simply saying DO followed by
the  file  name(with  no  extension).  If you do not ask to have your
files saved fast bands will be used  which  although  fast  will  all
disappear when you kill your job.

Wave will then announce that it is ready and you can type anything on
the  previous pages.   It will  respond with O.K.   when it  has been
supplied all the  parameters for  the function you  are defining.  It
will  then respond  with  an  * when  ready  for  the next  function.
Sometimes  in execution the servo program  will cause trouble. If you
do do  not get  a response  from the servo  program you  can type  ↑C
followed by REE. If you were indeed waiting for the servo program you
will be back talking to  the main program and  will have a new  servo
program running, if not  you will be in the SAIL  ALLOC mechanism and
will have lost all your data.